#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define MAX_ITEMS 1000;

struct abuff {
   char datos[MAX_ITEMS];  //vector de longitud indicada en 'inicializa.c'
   int nitems;
   /*poden engadirse aquí máis campos que poidan ser de interese*/
   /*para a xestión do  array datos */
};
typedef struct abuff tBuffer;
struct tcompartido {
   tBuffer buffer;
   int nlectores;
   int nescritores;
};
typedef struct tcompartido tMemCompartida;

void error_print_usage(const char *progname, int st) {

    if (st == EXIT_FAILURE) {
        printf("\
Proba %s -h para máis información.\n\
", progname);

        exit(st);
    } else {
        printf("Halluda!!\n");
        exit(st);
    }
}

int main(int argc, char *argv[]) {
	int nitems;

	int i;

	const char* progname = argv[0];
	
	if (argc == 3) {
		if (strcmp(argv[1], "-items") == 0) {
			nitems = atoi(argv[2]);
			if ((nitems <= MAX_ITEMS) && (nitems >= 0)) {
				printf("items %d\n", nitems);
			}
			else {
				error_print_usage(progname, EXIT_FAILURE);
			}
		} else {
			error_print_usage(progname, EXIT_FAILURE);
		}
	}
	
	/*chars = (char*) malloc (nitems);*/
	
	key_t key = ftok("/tmp", 'J');
	int shmid = shmget(key, nitems, 0600|IPC_CREAT|IPC_EXCL);
	if (shmid == -1) {
	    perror("FAIL");
	    abort();
	
	}
	printf("Memoria compartida %i\n", shmid);
	key_t semkey = ftok("/tmp", 'S');	
	int semid = semget(semkey, 4, 0600|IPC_CREAT|IPC_EXCL);
	if (semid == -1) {
	    perror("FAIL");
	    abort();
	
	}
	printf("Conjunto de semaforos %i\n", semid);	


	
	tMemCompartida *chars;
	chars =(tMemCompartida *) shmat(shmid, NULL, 0);
    if ((int) chars == -1) {
        perror("FAIL:");
        exit(1);
    }

	for (i = 0; i < nitems; i++) {
		chars[i] = '-';
	}
	printf("\nnumero de PID %d chars\n", getpid());
	for (i=0;i<nitems;i++) {
		printf("%c", chars[i]);
	}	
	putchar('\n');
	shmdt(chars);
	return 0;
}
